package code11_util;

import java.util.Arrays;

import org.junit.Test;

public class Test06Reg {

	@Test
	public void f1() {
		// \ 是转义符, 是特殊符号, 不能单独使用
		String s = "\t";// 把 t 转变为制表符
		System.out.println("abc");
		System.out.println(s+"abc");
		String s1 = "\\";// 使用第一个转义符把第二个转义符变成普通字符
		System.out.println(s1); // \
		System.out.println("\\\\");// \\
		
		// java中不能直接使用 正则的 \ 符号
		System.out.println("\\d");// \d 正则中的符号
	}
	
	@Test
	public void f2() {
		// 正则表达式, 是使用字符串定义的
		String regex = "\\d";// 一个一位的数字
		// 判断指定的字符串是否符合指定的正则格式要求
		System.out.println("a".matches(regex));
		System.out.println("123".matches(regex));
		System.out.println("1v".matches(regex));
		System.out.println("7".matches(regex));// true
	}
	@Test
	public void f3() {
		String regex = "\\d{1,2}";// 是一至两位的数字
		regex = "\\d?\\d";// 可以是一位或两位的数字
		regex = "[0-9]{1,2}";// 是一至两位的数字
		// 字符串中的内容是否是 >=0 或 <= 99
		System.out.println("1".matches(regex));// true
		System.out.println("12".matches(regex));// true
		System.out.println("123".matches(regex));
	}
	@Test
	public void f4(){
		String s = "asdqwe312we2434we2534";
		// 把2和3替换为X
		String regex = "[32]";
		s = s.replaceAll(regex, "X");
		System.out.println(s);
		System.out.println("------");
		s = "asdqwe312we2434we2534";
		// 把每一个数字都替换为X
		s = s.replaceAll("\\d", "X");
		System.out.println(s);
		System.out.println("------");
		s = "asdqwe312we2434we2534";
		// 把每一组数字都替换为X
		s = s.replaceAll("\\d+", "X");
		System.out.println(s);
		System.out.println("------");
		
		s = "asdqwe312we2434we2534";
		String newStr = s.replaceAll("\\d+", "");
		System.out.println(newStr);
		System.out.println("数字的个数:"+ (s.length()-newStr.length()) );
		System.out.println("字母的个数:" + newStr.length());
		
		System.out.println("-----");
		s = "asdqwe312we2434we2534";
		// 把第一组数字替换成 X
		String newStr2 = s.replaceFirst("\\d+", "X");
		System.out.println("newStr2:"+newStr2);
	}
	@Test
	public void f5(){
		String s = "asd12werw456gh4ft7890hgy7rty";
		// 根据数字拆分
		String[] arr = s.split("[0-9]+");
		System.out.println(Arrays.toString(arr));
	}
	@Test
	public void f6() {
		// 验证用户输入的日期格式是否符合 2022-03-22 要求
		String regex1 = "\\d{4}-\\d{2}-\\d{2}";
		// ^[0-9] 表示以一位数字开头
		// [^0-9] 表示不是数字, 等同于 \\D
		
		// 验证用户的登录名是否 由 3~12位的 字母或数字组成
		String regex2 = "[a-zA-Z0-9]{3,12}";
		
		// 验证用户的邮箱地址是否类似 abc@itany.com 或 qwe@bbs.cn 的格式
		String regex3 = "\\w+@\\w+\\.(com|cn)";// () 把某一部分作为一个整体, 把正则中的点转义 \.
		System.out.println("abc@itany.com".matches(regex3));
		System.out.println("qwe@bbs.cn".matches(regex3));
		System.out.println("qwe@bbs.net".matches(regex3));// false
		System.out.println("qwe@bbs1cn".matches(regex3));// false
	}
	@Test
	public void f7() {
		// 不变性
		String s1 = "tom";
		// 修改的是 变量 s1 在栈中的值, 无法修改 tom 对象中的值
		s1 = "jack";
		
	}
	@Test
	public void f8() {
		// String常量
		String s1 = "tom";// 只创建一次, 并存储在常量池
		String s11 = "tom";
		String s12 = "tom";
		String s13 = "tom";
		String s14 = "tom";
		String s15 = "tom";
		System.out.println(s1 == s11);// true
		System.out.println(s11 == s12);// true
		// 正常的使用构造函数创建String
		String s2 = new String("tom");
	}
	@Test
	public void f9() {
		// 只创建一次, 并存储在常量池中
		String s1 = "tom";
		// 会先从常量池中查询是否存在该字符串的值，存在则直接引用，否则就重新创建。
		String s2 = "tom";
		System.out.println(s1 == s2);// true
		// 会强制开辟内存空间，存储该字符串的值, 不存储在常量池中
		String s3 = new String("tom");
		System.out.println(s3 == s1);// false
		
		System.out.println("--------------");
		
		String a1 = "bbb";//1(String)
		String a2 = "bb";//2(String)
		String a3 = "b";//3(String)
		
		// 字符串变量的相加本质是通过 StringBuilder/StringBuffer 进行 append 实现的字符串拼接，最后通过 toString 转为 String。
		// 使用此方式拼接字符串效率比较低
		String a4 = a2 + a3;// bbb. 4(StringBuilder),5(String)
		System.out.println(a1 == a4);// false
		
		// 对于常量字符串，在编译期会处理这类的运算，以提高程序运行效率
		String a5 = "bb" + "b";// bbb
		// 即class中的内容是 String a5 = "bbb"; 在常量池, 直接引用,未创建新对象
		System.out.println(a1 == a5);// true
		// 共创建 4个String，1个StringBuilder
	}
	
}
